package com.leen.util;

import com.alibaba.fastjson.JSONObject;
import com.leen.vo.LoginUserVO;
import io.jsonwebtoken.Claims;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * 创建用户登录后的JWT字符
 * @author wy
 */
@Component
public class UserTokenUtil {

    @Autowired
    private JwtTokenUtil  jwtTokenUtil;


    /**
     * 根据用户信息生成token
     */
    public String generateToken(LoginUserVO loginUserVO) {
        Map<String, Object> claims = new HashMap<>(4);
        //把java 序列化 json
        String str= JSONObject.toJSONString(loginUserVO);

        claims.put(JwtTokenUtil.CLAIM_KEY_USERNAME, str);
        claims.put(JwtTokenUtil.CLAIM_KEY_CREATED, new Date());
        return jwtTokenUtil.generateToken(claims);
    }

     /**
     * 验证token是否还有效
     *
     * @param token       客户端传入的token
     * @param loginUserVO 从数据库中查询出来的用户信息
     */
    public boolean validateToken(String token, LoginUserVO loginUserVO) {
        Claims claims = jwtTokenUtil.getClaimsFromToken(token);
        //验证是否是同一个对象
        String str= JSONObject.toJSONString(loginUserVO);
        //取得jwt中的内容
        String jwtStr=claims.getSubject();

        return jwtStr.equals(str) && !jwtTokenUtil.isTokenExpired(token);
    }

    /**
     * 重新为jwt生成过期时间
     * @param token
     * @return
     */
    public String refreshToken(String token){
        String jwt= token;
        //如果能刷新(token还没有过期)
        if(jwtTokenUtil.canRefresh(token)){
            jwt= jwtTokenUtil.refreshToken(token);
        }
        return jwt;
    }



}
